#!/usr/bin/env python
# -*-coding: utf-8 -*-

import json
import psycopg2
import sys
import os

from xtls.logger import get_logger

ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
if ROOT_PATH not in sys.path:
    sys.path.append(ROOT_PATH)

from company_crawler.company_crawler import camel_to_underline
from company_crawler.company_crawler import get_db_config

reload(sys)
sys.setdefaultencoding('utf-8')
logger = get_logger(__file__)
db_config = get_db_config(ROOT_PATH)

conn = psycopg2.connect(database=db_config['db'], host=db_config['host'], port=db_config['port'],
                        user=db_config['user'], password=db_config['pw'])
cur = conn.cursor()
def get_stock_sample():
    stock_sample = {
        'stock_code': '000001', # 股票代码
        'stock_name': '国农科技', # 股票简称
        'stock_market': 'szmb', # 股票市场，szmb:深市主板; szsme:中小企业板; szcn:创业板; shmb: 沪市主板; xsb: 新三板
        'xsb_fcbj': '基础层', # 新三板股票分层，新三板股票独有属性
        'brief': { 	# 公司概况： A股市场和新三板股票均有
                    'companyFullName': '深圳中国农大科技股份有限公司',  # 公司全称
                    'companyEnglishName': 'Shenzhen Cau Technology Co., Ltd.',  # 公司英文名
                    'regAddress': '广东省深圳市南山区中心路（深圳湾段）3333号中铁南方总部大厦503室', # 注册地址
                    'province': '广东',  # 公司省份
                    'companyName': '国农科技', # 公司简称
                    'legalPerson': '李大红',  # 法定代表人
                    'secretary': '徐文苏',  # 公司董秘
                    'regCap': 85462146, # 注册资本（元）
                    'industryId': '医药制造业', # 二级行业种类
                    'primaryIndustryId': '制造业',  # 一级行业种类（目前无数数据）
                    'zipcode': '518045',  # 邮政编码
                    'phone': '0755-83521596',  # 公司电话
                    'fax': '0755-83521727',  # 公司传真
                    'website': 'www.sz000004.cn',  # 公司网址
                    'listingDate': '1989-12-23',  # 上市时间(A股) or 挂牌时间(新三板)
                    'prospectusDate': '1989-12-23',  # 招股时间（仅A股）
                    'issuedShares': 12500000, # 发行数量(股) （仅A股）
                    'issuedPrice': 1.25, # 发行价格(元) （仅A股）
                    'pe': 3.45, # 发行市盈率(倍) （仅A股）
                    'releaseModeId': '定向发行 ', # 发行方式 （仅A股）
                    'mainUnderwriterId': '公司xxx', # 主承销商 （仅A股）
                    'listingRecommenderId': '张三', # 上市推荐人 （仅A股）
                    'sponsorInstitutionId': '公司xxxxxx', # 保荐机构 （仅A股）
                    'transferModeId': '协议', # 转让方式 （仅新三板）
                    'brokerId': 'xxxxx证券公司', # 主办券商 （仅新三板）
                    'totalShare': 12500000000, # 总股本 （仅新三板）
        },
        'management': [ # 公司高管： A股市场和新三板的股票均有
                {
                    'name': '李华', # 高管姓名
                    'gender': '男', # 性别
                    'birthYear': '1974', # 出生年份
                    'degreeId': '硕士', # 学历
                    'positionId': '董事,总经理,董事长秘书', # 职务
                },
        ],
        'holder': [ # 十大股东：A股市场和新三板的股票均有，A股市场有十大股东和流通股东; 新三板只有十大股东。可以通过holder_type区分
                {
                    'holderType': 'sharesholder', # 股东种类 (十大股东sharesholder, 流通股东circulatingholder)
                    'deadline': '2016-06-30', # 截止时间
                    'name': '李华', #股东姓名
                    'shares': 120000000, # 持股数量(股)
                    'proportion': 0.31, # 持股比例（小数，不是百分数）
                    'sharesPropertyId': '流通受限股份,流通A股' # 股份性质（仅A股）
                },
        ],
        'issue': { # 发行认筹：仅A股
                    'issueTypeId': '增发', # 发行类型
                    'issueStartDate': '1989-12-23', # 发行起始日
                    'issuePropertyId': '首发A股', # 发行性质
                    'issueStockTypeId': 'A股', # 发行股票种类
                    'releaseModeId': '定向发行', # 发行方式
                    'issuedPublicShares': 56525000, # 发行公众股数量(股)
                    'issuedPriceRmb': 1.21, # 人民币发行价格(元)
                    'issuedPriceForeign': 1.33, # 外币发行价格(元)
                    'foreignCurrencyTypeId': '', # 外币种类（暂无数据）
                    'issueFundRaised': 12500000, # 实际募集资金(元)
                    'issueCost': 12480000, # 实际发行费用(元)
                    'pe': 2.34, # 发行市盈率(倍)
                    'expectedRatioOl': 0.135, # 上网定价中签率(小数,不是百分比)
                    'expectedRatioSm': 0.351, # 二级配售中签(小数, 不是百分比)
        },
        'dividend': [ # 分红：仅A股
                {
                    'dividendYear': '2015年度', # 分红年度
                    'dividendPlan': '10派0.49元（含税）', # 分红方案
                    'recordDate': '2015-09-01', # 股权登记日
                    'rightOutDate': '2015-09-15', # 除权基准日
                    'bonusOfferDate': '2015-09-22', # 红股上市日
                },
        ],
        'allotment': [  # 配股：仅A股
                {
                    'allotYear': '2015年度',  # 配股年度
                    'allotPlan': '10配2.727股，每股7.5元（实施方案）', # 配股方案
                    'allotPrice': 7.5,  # 配股价
                    'recordDate': '2015-09-01',  # 股权登记日
                    'rightOutDate': '2015-09-06',  # 除权基准日
                    'startDate': '2015-09-22',  # 配股交款起始日
                    'stopDate': '2015-09-30',  # 配股交款终止日
                    'circulateOfferDate': '2015-10-25',  # 配股可流通部分上市日
                },
        ],
        'stockstructure': [ # 股本结构：仅A股
                {
                    'changeDate': '2016-06-30',  # 变动日期
                    'changeReasonId': '定期报告', # 变动原因
                    'outstandingShares': 11023063200,  # 已流通股份(股)
                    'commonShares': 9708107800,  # 已流通股份_人民币普通股(股)
                    'bShares': 0,  # 已流通股份_境内上市外资股B股(股)
                    'foreignShares': 1314955500,  # 已流通股份_境外上市外资股(股)
                    'otherOutstanding': 0,  # 已流通股份_其他流通股(股)
                    'limitShares': 16088800,  # 流通受限股份(股)
                    'limStateShares': 0,  # 流通受限股份_国有股(股)
                    'otherDomesticShares': 16088800,  # 流通受限股份_国有股以外的内资股(股)
                    'foreignHoldShares': 0,  # 流通受限股份_外资持股(股)
                    'allotLegalShares': 0,  # 流通受限股份_配售法人股(股)
                    'nonOutstandingShares': 0,  # 未流通股份(股)
                    'nonStateShares': 0,  # 未流通股份_国有股(股)
                    'domensticLegalShares': 0,  # 未流通股份_境内法人持股(股)
                    'foreignLegalShares': 0,  # 未流通股份_境外法人持股(股)
                    'naturalShares': 0,  # 未流通股份_自然人持股(股)
                    'otherNonOutstandingShares': 0,  # 未流通股份_其他未流通股(股)
                    'totalShares': 11039152000,  # 总股本(股)
                },
        ],
        'memo': [ # 公司备忘： 仅A股
                {
                    'event': '分红转增除权除息日', # 备忘事件
                    'date': '2016-07-29',  # 备忘时间
                },
        ]
    }
    return stock_sample

def check_null_about(tab_name):
    result = {
        'total': 0,
        'total_xsb': 0,
        'total_a': 0,
        'xsb': {},
        'a_share': {},
    }
    sample = get_stock_sample().get(tab_name)
    if isinstance(sample, list):
        sample = sample[0]
    keys = sample.keys()
    total = get_total(tab_name)
    result.update(total)
    sql = "SELECT count(*) FROM company_%s " \
          "WHERE %s is not null " \
          "AND stock_id in (SELECT id FROM stock WHERE stock_market%s'xsb%' AND alive_op=True) " \
          "AND version_num=(SELECT max(version_num) FROM company_%s);"
    # sql = sql % ('management', 'degree_id', '=', 'management')
    # print sql
    # raw_input()

    if result.get('total_a') > 0:
        sql_a = sql % (tab_name, '%s', 'NOT LIKE', tab_name)
        result['a_share'] = calculate_rate(keys, result.get('total_a'), sql_a)

    if result.get('total_xsb') > 0:
        sql_xsb = sql % (tab_name, '%s', 'LIKE', tab_name)
        result['xsb'] = calculate_rate(keys, result.get('total_xsb'), sql_xsb)

    return result


def get_total(tab_name):
    sql_total = "SELECT count(stock_id) FROM company_%s " \
                "WHERE stock_id in (SELECT id FROM stock WHERE stock_market%s'xsb%' AND alive_op=True) " \
                "AND version_num=(SELECT max(version_num) FROM company_%s);"
    sql_total_xsb = sql_total % (tab_name, '=', tab_name)
    sql_total_a = sql_total % (tab_name, '!=', tab_name)

    cur.execute(sql_total_a)
    total_a = cur.fetchone()[0] or 0

    cur.execute(sql_total_xsb)
    total_xsb = cur.fetchone()[0] or 0

    total = total_a + total_xsb

    return {'total': total,
            'total_a': total_a,
            'total_xsb': total_xsb, }


def calculate_rate(keys, total, sql):
    result = {}
    for key in keys:
        key = camel_to_underline(key)
        sql_iter = sql % key
        cur.execute(sql_iter)
        cnt = cur.fetchone()[0]
        result[key] = float(cnt)/total if cnt else None

    return result


def main():
    tab_list = ['brief', 'issue', 'dividend', 'allotment', 'management', 'stockstructure', 'holder', 'memo']
    result_tab = {}
    for tab_name in tab_list:
        print 'calculate %s' % tab_name
        result_tab[tab_name] = check_null_about(tab_name)

    with open('./check_null.json', 'a') as f:
        f.write(json.dumps(result_tab, indent=4))

if __name__ == '__main__':
    main()
    # print get_stock_sample().keys()
    # print ['brief', 'issue', 'dividend', 'allotment', 'management', 'stockstructure', 'holder', 'memo']